---
title: DDD 持久化
sidebar_position: 0
---




对于任何规模的企业应用来说，数据持久化都是其中必不可少的一个关键组成部分。因为持久化是如此重要，而关系数据库是事实上的数据存储标准，所以 Java 的所有者 Sun Microsystems 早早就为数据库访问制定了规范，这就是 JDBC（Java Database Connectivity）。

JDBC 的本意是为不同种类的关系数据库指定统一的 API，这样一来，Java 开发者就不再需要针对不同类型的关系数据库分别编写一套不同的访问代码。但是在 JDBC 的使用上，还存在下面的严重问题无法解决：

* 使用 JDBC 规范编写的数据访问代码非常冗长，每个连接、语句、结果集都要记得手动关闭，而连接、语句、结果集的创建、操作和关闭都会抛出受检（checked）异常，稍不小心就会导致内存泄露或者连接泄露。甚至语句的关闭都会抛出异常，需要再次捕获并且在 finally 语句里面处理。
* JDBC 虽然在 JPA 层面做出了统一，但是在 SQL 语句的层面上却不能统一。针对 Oracle 编写的 JDBC 访问代码不能直接移植到 MySQL 上，因为它们各自支持不同的方言。因此， JDBC 不能保证数据的可移植性。
* Java 是一种面向对象的编程语言。在企业应用中，需要持久化到数据库的是领域层的领域对象（实体和值对象）。领域对象之间有四种关系：关联、泛化（继承）、聚合和组合。而数据库核心对象是二维数据表，表与表之间只有一种关联关系。在对象模型和关系模型之间存在阻抗失配。要将实体对象持久化到关系数据库中，需要编写大量的转换代码。

对 Java 持久化进行标准化的第二次尝试是 EJB 规范中的实体 Bean 。实体 Bean 是可以存储在持久存储介质上的持久对象，常用来表示持久性数据并提供操作这些数据的方法。但是实体 Bean 非常难用，又只能在 JavaEE 的环境下使用。

由于官方规范的落后，Java 社区中的一些程序员决定先行一步，探索更好的方式实现数据持久化。2002 年 Martin Fowler 出版了 《Patterns of Enterprise Application Architecture》一书，针对数据持久化提出了数据映射模式，建议通过数据映射器将领域模型映射到关系模型。

2001 年，ORM 软件 Hibernate 横空出世。此后几年时间，Hibernate 和 Spring 两大框架联手，将 EJB 规范以及支持它的应用服务器扫入了历史垃圾堆，从此 EJB 成为了历史。

后来 Java 的管理组织 JCP 以 Hibernate 为参考推出了 Java Persistence API （简称 JPA），正式将对象关系映射这种数据持久化的形式标准化、规范化，成为 Java 持久化的一个标准。

Jpa （在 Hibernate 这类 JPA 实现框架的支持下，已经大大简化了持久化的工作。Spring  Data Jpa 的出现，进一步简化了数据查询的工作。使用 Spring Data Jpa 之后，大多数情况无需编写一行查询代码，只需要根据实体属性定义进行查询、分页和排序的接口方法，其余的交给 Spring 在运行时实现就可以了。

## 主要内容
* 使用 JPA 编写 ORM 。只使用 JPA 的注解、接口和类来编写 ORM 代码，不使用 Hibernate 提供的任何扩展。
* 使用 Hibernate 运行时支持。Hibernate 作为 JPA 的实现，只在幕后默默支持 ORM 。任何代码都不直接使用和依赖 Hibernate。
* 使用 Spring Data JPA 查询。通过 Spring Data JPA,以一种更加简化的方式实现数据查询。

基于 JPA2.2 ，Hibernate 5.4 和 Spring Data JPA 2.3 ,Java 8 以上版本。